package com.atguigu.springbootmq.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ReturnedMessage;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;


@Slf4j
@Component //实现类 @PostConstruct该注解被用来修饰一个非静态的void（）方法。
// 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行，并且只会被服务器执行一次。
// PostConstruct在构造函数之后执行，init（）方法之前执行。
public class MyCallBack implements RabbitTemplate.ConfirmCallback,RabbitTemplate.ReturnsCallback
{

    @Autowired
    private RabbitTemplate rabbitTemplate;


    @PostConstruct
    public void init(){
        //注入
        rabbitTemplate.setConfirmCallback(this);
        rabbitTemplate.setReturnsCallback(this);
    }




    /**
     * 交換機确认回调方法
     *
     * @param correlationData 保存回调的id及其及其相关的消息
     * @param b               交换机收到消息 true   否则false   判断成功或者失败
     * @param s               成功的话  null      false失败原因
     */


    @Override
    public void confirm(CorrelationData correlationData, boolean b, String s) {
       //true的时候拿到id
        String id = correlationData != null ? correlationData.getId() : "";

        if (b) {
        log.info("交换机已经收到了消息:ID为：{}",id);
        }else {
            log.info("交换机未收到消息:ID为：{},原因是什么呢{}",id,s);

        }


    }
//可以在当前消息传递过中不可达到目的时候将消息返回生产者
    //只有不可达目的的时候 才进行回退

    @Override
    public void returnedMessage(ReturnedMessage returnedMessage) {
        /**
         *  private final Message message;   消息
         *     private final int replyCode;
         *     private final String replyText; 错误的原因
         *     private final String exchange;交换机
         *     private final String routingKey;  key
         */

        log.info("消息{}，被交换机{}退回，退回原因{}，路由key是多少{}",
               new String(returnedMessage.getMessage().getBody()),returnedMessage.getExchange(),
                returnedMessage.getReplyText(),returnedMessage.getRoutingKey());
    }
}
